home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / basic / qbnws101.zip / FINDEM.BAS next >
BASIC Source File  |  1989-11-01  |  5KB  |  187 lines

  1.  
  2. DEFINT A-Z
  3.  
  4. 'FindEm.BAS -- code to do directory searches with QuickBASIC 4.x
  5.  
  6.  TYPE RegType
  7.       AX    AS INTEGER
  8.       BX    AS INTEGER
  9.       CX    AS INTEGER
  10.       DX    AS INTEGER
  11.       BP    AS INTEGER
  12.       SI    AS INTEGER
  13.       DI    AS INTEGER
  14.       Flags AS INTEGER
  15.  END TYPE
  16.  
  17.  TYPE RegType2
  18.       AX    AS INTEGER
  19.       BX    AS INTEGER
  20.       CX    AS INTEGER
  21.       DX    AS INTEGER
  22.       BP    AS INTEGER
  23.       SI    AS INTEGER
  24.       DI    AS INTEGER
  25.       Flags AS INTEGER
  26.       DS AS INTEGER
  27.       ES AS INTEGER
  28.  END TYPE
  29.  
  30.  TYPE FileType
  31.       Attr AS INTEGER
  32.       FileTime AS STRING * 5
  33.       FileDate AS STRING * 8
  34.       FSize AS LONG
  35.       FName AS STRING * 12
  36.  END TYPE
  37.  
  38.     'Must link with QB.LIB (QB.QLB) for Interrupt functions
  39.  
  40. DECLARE SUB Interrupt (Intnum%, InReg AS RegType, OutReg AS RegType)
  41. DECLARE SUB InterruptX (Intnum%, InReg2 AS RegType2, OutReg2 AS RegType2)
  42.  
  43. DECLARE FUNCTION FindFirst% (FileName$, Attr%, FileData AS FileType,_
  44.  FirstOrNext%)
  45.  
  46.  
  47. 'Constants for use with FindFirst (just to make things easier to read):
  48.  
  49. 'Actions:
  50.  
  51. CONST FIRST = 0
  52. CONST AGAIN = 1
  53.  
  54. 'Attributes:
  55.  
  56. CONST NORMAL = 0
  57. CONST READONLY = 1
  58. CONST HIDDEN = 2
  59. CONST SYSTM = 4
  60. CONST LABEL = 8
  61. CONST SUBDIR = 16
  62. CONST ARCHIVE = 32
  63.  
  64. 'Error returns:
  65.  
  66. CONST INVALIDPATH = 2
  67. CONST NOMATCH = 18
  68.  
  69.  
  70. DIM FileData AS FileType
  71. DIM FileSize AS STRING * 8
  72.  
  73.   'Demonstration program for FindFirst Function--print DOS-like directory
  74.  
  75.   CLS
  76.   A$ = "\*.*"                                 'Search mask
  77.   A = FindFirst(A$, SUBDIR, FileData, FIRST)  'Findfirst
  78.   IF A THEN                                   'Error
  79.     IF A = INVALIDPATH THEN
  80.         PRINT "Invalid path."
  81.       ELSE
  82.         PRINT "No matching files."
  83.     END IF
  84.     END
  85.   END IF
  86.   Counter = 0                                 'Set counter
  87.  
  88.   DO                                          'Start looping...
  89.    
  90.     PRINT FileData.FName; "  ";
  91.     IF FileData.Attr AND SUBDIR THEN
  92.         FileSize = "<DIR>"
  93.       ELSE
  94.         FileSize = MID$(STR$(FileData.FSize), 2)
  95.     END IF
  96.     PRINT FileSize; "  "; FileData.FileDate; "  "; FileData.FileTime
  97.     Counter = Counter + 1
  98.  
  99.   LOOP WHILE FindFirst("", NORMAL, FileData, AGAIN) = 0  'Until Findnext fails
  100.  
  101.   PRINT "There were"; Counter; "matching file(s) found." 'Finished
  102.  
  103. END
  104.  
  105. '
  106. FUNCTION FindFirst% (FileName$, Attr%, FileData AS FileType, FirstOrNext%)
  107.  
  108.   'Function to do directory searches
  109.   'FileName$ contains a pattern to match (*.*, *.DOC, Thisfile.EXE, etc.)
  110.   'Attr% is the attribute for which to search (0=normal files)
  111.   'FileData is Type FileType into which we will put data on matched file
  112.   'FirstOrNext% determines action; 0=Find first match, non-zero=Find next
  113.  
  114.   DIM InRegs AS RegType2
  115.   DIM OutRegs AS RegType2
  116.   DIM FDate AS LONG
  117.   DIM FTime AS LONG
  118.   STATIC DTASeg AS INTEGER
  119.   STATIC DTAOff AS INTEGER
  120.  
  121.   FindFirst% = 1   'A non-zero return indicates an error
  122.  
  123.   'Set up for findfile interrupt call
  124.  
  125.   InRegs.AX = &H4F * 256          'FindNext
  126.   IF FirstOrNext = 0 THEN         'FindFirst
  127.     InRegs.AX = &H2F * 256         'Find current DTA (probably in PSP)
  128.     InterruptX &H21, InRegs, OutRegs
  129.     DTASeg = OutRegs.ES            'Segment of current DTA
  130.     DTAOff = OutRegs.BX            'Offs of current DTA
  131.     FLName$ = FileName$ + CHR$(0) 'ASCIIZ filename
  132.     InRegs.AX = &H4E * 256
  133.     InRegs.CX = Attr%             'Attribute
  134.     InRegs.DS = VARSEG(FLName$)   'Segment of ASCIIZ filename
  135.     InRegs.DX = SADD(FLName$)     'Offset of ASCIIZ filename
  136.   END IF
  137.  
  138.   InterruptX &H21, InRegs, OutRegs 'Actually DO IT
  139.  
  140.   IF OutRegs.Flags AND 1 THEN   'Error!
  141.     FindFirst = OutRegs.AX      '2h=Invalid path
  142.                                 '12h=No (more) matching file(s)
  143.     EXIT FUNCTION
  144.   END IF
  145.   FindFirst% = 0                'Ok, we've got something...
  146.  
  147.   DEF SEG = DTASeg              'Set PEEK up to get info from DTA
  148.  
  149.   'Now fill in our FileType structure with info from DTA
  150.  
  151.   FileData.Attr = PEEK(DTAOff + 21)   'Attribute of file
  152.  
  153.   'Calculate the file size in bytes
  154.  
  155.   FileData.FSize = PEEK(DTAOff + 26) + (PEEK(DTAOff + 27) * 256&)
  156.   FileData.FSize = FileData.FSize + ((PEEK(DTAOff + 28) +_
  157.    (PEEK(DTAOff + 29) * 256)) * 65536)
  158.  
  159.   'Get the filename
  160.  
  161.   FLName$ = ""
  162.   FOR X = 30 TO 42
  163.     IF PEEK(DTAOff + X) = 0 THEN EXIT FOR
  164.     FLName$ = FLName$ + CHR$(PEEK(DTAOff + X))
  165.   NEXT
  166.   FileData.FName = FLName$
  167.  
  168.   'Convert date/timestamp into something we can use directly
  169.  
  170.   FTime = PEEK(DTAOff + 22) + (PEEK(DTAOff + 23) * 256&)
  171.   FDate = PEEK(DTAOff + 24) + (PEEK(DTAOff + 25) * 256&)
  172.   Temp = FTime / 32
  173.   Min = Temp MOD 64
  174.   Hour = Temp / 64
  175.   Temp = FDate
  176.   Day = Temp MOD 32
  177.   Temp = Temp / 32
  178.   Month = Temp MOD 16
  179.   Year = Temp / 16 + 79
  180.   FileData.FileTime = RIGHT$("0" + MID$(STR$(Hour), 2), 2) + ":" +_
  181.    RIGHT$("0" + MID$(STR$(Min), 2), 2)
  182.   FileData.FileDate = RIGHT$("0" + MID$(STR$(Month), 2), 2) + "/" +_
  183.    RIGHT$("0" + MID$(STR$(Day), 2), 2) + "/" + RIGHT$("0" +_
  184.    MID$(STR$(Year), 2), 2)
  185.      
  186. END FUNCTION
  187.